#include "infrared.h"
#include "delay.h"


rt_bool_t  infraled_byte_flag = RT_FALSE;
static uint32_t frame_data = 0;  /* 一帧数据缓存 */
/**
 * @desc  : 计算高电平的时间
 * @param : None
 * @return: 高电平时间
 * @date  : 2017-9-9 10:34:05
 */
static uint8_t count_pulse_time(void)
{
    uint8_t time = 0;
    while (INFRARED_DQ_IN)
    {
        time ++;
        delay_us(20);
        if (time == 250) /* 20*250 = 5000us 5ms*/
            return time;
    }
    return time;
}
/**
 * @desc  : 解析并获取红外数据
 * @param : None
 * @return: 红外收到的数据
 * @date  : 2017-9-9 12:35:37
 */
uint8_t get_infraled()
{
    uint8_t first_byte, sec_byte, tir_byte, fou_byte;

    first_byte = frame_data >> 24;
    sec_byte = (frame_data >> 16) & 0xff;
    tir_byte = frame_data >> 8;
    fou_byte = frame_data;

    infraled_byte_flag = RT_FALSE; /* 清除标志位 */

    /* 帧数据有4个字节，第一个字节是遥控的ID，第二个字节是第一个字节的反码第三个数据是遥控的真正的键值，第四个字节是第三个字节的反码*/
    if ((first_byte == (uint8_t)~sec_byte) && (first_byte == IRDA_ID))
    {
        if (tir_byte == (uint8_t)~fou_byte)
            return tir_byte;
    }
    return 0;   /* 错误返回 */
}

/**
 * @desc  : 外部中断回调函数
 * @param : GPIO_Pin 中断引脚号
 * @return: None
 * @date  : 2017-9-9 07:40:51
 */
static void infrared_handle()
{
    uint8_t pulse_time = 0;       /* 脉冲宽度*/
    uint8_t leader_code_flag = 0; /* 引导码标志位，当引导码出现时，表示一帧数据开始 */
    uint8_t irda_data = 0;        /* 数据暂存位 */

    while (1)
    {
        if (INFRARED_DQ_IN == SET)  /* 只测量高电平的时间 */
        {
            pulse_time = count_pulse_time();

            if (pulse_time >= 250) /* >=5ms 不是有用信号 当出现干扰或者连发码时，也会break跳出while(1)循环 */
            {
                break; /* 跳出while(1)循环 */
            }
            if (pulse_time >= 200 && pulse_time < 250)    /* 4ms~4.5ms 为前引导位*/
            {
                leader_code_flag = 1;
            }
            else if (pulse_time >= 10 && pulse_time < 50) /* 0.56ms: 0.2ms~1ms 逻辑0脉冲*/
            {
                irda_data = 0;
            }
            else if (pulse_time >= 50 && pulse_time < 100) /* 1.68ms：1ms~2ms 逻辑1脉冲*/
            {
                irda_data = 1 ;
            }
            else if (pulse_time >= 100 && pulse_time <= 200) /* 2.1ms：2ms~4ms 连发码*/
            {
                /* 连发码，在第二次中断出现 */
                infraled_byte_flag = RT_TRUE; /* 一帧数据接收完成 */
                break;                        /* 跳出while(1)循环 */
            }
            if (leader_code_flag == 1)
            {
							  frame_data <<= 1;
                frame_data += irda_data;/* 在第一次中断中完成 */
            }
        }
    }
}

/**
 * @desc  : 红外引脚初始化
 * @param : None
 * @return: None
 * @date  : 2017-9-9 06:56:37
 */
static int rt_hw_infrared_init(void)
{
    rt_pin_attach_irq(2, 0, infrared_handle, 0);
    pin_irq_enable(2, PIN_IRQ_ENABLE);
}
INIT_BOARD_EXPORT(rt_hw_infrared_init);